package com.hyfrogx.modules.sys.controller;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hyfrogx.common.annotation.SysLog;
import com.hyfrogx.common.base.QueryForm;
import com.hyfrogx.common.utils.R;
import com.hyfrogx.common.validator.group.AddGroup;
import com.hyfrogx.common.validator.group.UpdateGroup;
import com.hyfrogx.modules.sys.form.config.ConfigSaveForm;
import com.hyfrogx.modules.sys.form.config.ConfigUpdateForm;
import com.hyfrogx.modules.sys.form.config.ConfigVo;
import com.hyfrogx.modules.sys.service.SysConfigService;
import com.hyfrogx.modules.sys.entity.SysConfigEntity;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;


/**
 * 系统配置信息
 *
 * @author wanglei
 * @date 2019-06-03 17:57:00
 */
@RestController
@RequestMapping("/sys/config")
public class SysConfigController extends AbstractController {
	@Autowired
	private SysConfigService sysConfigService;

	/**
	 * 所有配置列表
	 */
	@PostMapping("/list")
	@RequiresPermissions("sys:config:list")
	public R list(@RequestBody QueryForm<SysConfigEntity> form) {
		String paramKey = form.getParamStr("paramKey");
		IPage<ConfigVo> page = sysConfigService.queryVoPage(
				form.getIPage(),
				form.getWrapper(false)
						.like(StrUtil.isNotBlank(paramKey), "param_key", paramKey)
				, ConfigVo.class
		);
		return R.ok().put("page", page);
	}


	/**
	 * 配置信息
	 */
	@PostMapping("/info/{id}")
	@RequiresPermissions("sys:config:info")
	public R info(@PathVariable("id") Long id) {
		ConfigVo config = sysConfigService.queryVoById(id, ConfigVo.class);
		return R.ok().put("data", config);
	}

	/**
	 * 保存配置
	 */
	@SysLog("保存配置")
	@PostMapping("/save")
	@RequiresPermissions("sys:config:save")
	public R save(@RequestBody @Validated(AddGroup.class) ConfigSaveForm config) {
		if (ObjectUtil.isNotNull(sysConfigService.saveForm(getUserId(), config))) {
			return R.ok();
		}
		return R.error("保存配置失败");
	}

	/**
	 * 修改配置
	 */
	@SysLog("修改配置")
	@PostMapping("/update")
	@RequiresPermissions("sys:config:update")
	public R update(@RequestBody @Validated(UpdateGroup.class) ConfigUpdateForm config) {
		if (ObjectUtil.isNotNull(sysConfigService.updateForm(getUserId(), config))) {
			return R.ok();
		}
		return R.error("修改配置失败");
	}

	/**
	 * 删除配置
	 */
	@SysLog("删除配置")
	@PostMapping("/delete")
	@RequiresPermissions("sys:config:delete")
	public R delete(@RequestBody List<Long> ids) {
		if (sysConfigService.deleteByIdList(getUserId(), ids)) {
			return R.ok();
		}
		return R.error("删除配置失败");
	}

	/**
	 * 启用配置
	 */
	@SysLog("启用配置")
	@PostMapping("/enable")
	@RequiresPermissions("sys:config:enable")
	public R enable(@RequestBody List<Long> ids) {
		if (sysConfigService.enableByIdList(getUserId(), ids)) {
			return R.ok();
		}
		return R.error("启用配置失败");
	}

	/**
	 * 禁用配置
	 */
	@SysLog("禁用配置")
	@PostMapping("/disable")
	@RequiresPermissions("sys:config:disable")
	public R disable(@RequestBody List<Long> ids) {
		if (sysConfigService.disableByIdList(getUserId(), ids)) {
			return R.ok();
		}
		return R.error("禁用配置失败");
	}

}
